<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /*typeof*/
        (function () {
            /*typeof 对于原始类型（boolean，null,undefined,number,string,symbol），
            缺点：除了 null 以及不能区分object 都可以显示正确的类型
            原因null 二进制000  而对象在计算中都是以000计算机存储（浏览器bug）*/
            //原始类型存储的都是值，是没有函数可以调用的，比如 undefined.toString() 会报错
            typeof 1 // 'number'
            typeof '1' // 'string'
            typeof undefined // 'undefined'
            typeof true // 'boolean'
            typeof Symbol() // 'symbol'
            typeof null // 'object'

            //typeof 对于对象来说不能细分数组、正则、对象中的其他值，因为返回都是Object,除了函数
            typeof [] // 'object'
            typeof {} // 'object'
            typeof console.log // 'function'
            typeof Number // 'function'
        })()
    </script>

    <script>
            /*
            instanceof
            */
            (function () {
                /*
                instanceof 判断一个对象的正确类型，instanceof内部机制是通过原型链来判断的(需要实例)
                 缺点：1.底层机制：只要当前实例出现在原型链上proto结果都是true）
                 2.不能检测基本类型
                */
                let arr = []
                console.log(arr instanceof Array)//true
                console.log(arr instanceof RegExp) //false
                console.log(arr instanceof Object) //true
                console.log(1 instanceof Number) //false

                const Person = function () { }
                const p1 = new Person()
                console.log(p1 instanceof Person) // true
                var str = 'hello world'
                console.log(str instanceof String)// false

                var str1 = new String('hello world')
                console.log(str1 instanceof String)// true
            })()
    </script>

    <script>
            /*
            constructor
            */
            (function () {
                /*
                constructor相比instanceof 支持基本类型
                    缺点：可以随意修改
                */
                let arr = []
                console.log(arr.constructor === Array)//true
                console.log(arr.constructor === RegExp) //true
                console.log(arr.constructor === Object) //false
                let n = 1
                // Number.prototype.constructor = 'A' //可以随便更改 更改后就不正确了
                console.log(n.constructor === Number) //true
            })()
    </script>


    <script>
            /*
             Object.prototype.toString.call()
            */
            (function () {
                /*
               Object.prototype.toString.call()  标准检测 
                返回当前实例所属类信息 toString执行this是obj
                */
                let arr = []
                console.log(arr.constructor === Array)//true
                console.log(arr.constructor === RegExp) //true
                console.log(arr.constructor === Object) //false
                let n = 1
                // Number.prototype.constructor = 'A' //可以随便更改 更改后就不正确了
                console.log(n.constructor === Number) //true
            })()
    </script>
</body>

</html>